<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
  <!ENTITY % general-entities SYSTEM "../general.ent">
  %general-entities;
]>

<sect1 id="ch-tools-gcc-pass1" role="wrap" xreflabel="gcc-pass1">
  <?dbhtml filename="gcc-pass1.html"?>

  <sect1info condition="script">
    <productname>gcc-pass1</productname>
    <productnumber>&gcc-version;</productnumber>
    <address>&gcc-url;</address>
  </sect1info>

  <title>GCC-&gcc-version; - Проход 1</title>

  <indexterm zone="ch-tools-gcc-pass1">
    <primary sortas="a-GCC">GCC</primary>
    <secondary>tools, pass 1</secondary>
  </indexterm>

  <sect2 role="package">
    <title/>

    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
    href="../chapter06/gcc.xml"
    xpointer="xpointer(/sect1/sect2[1]/para[1])"/>

    <segmentedlist>
      <segtitle>&buildtime;</segtitle>
      <segtitle>&diskspace;</segtitle>

      <seglistitem>
        <seg>&gcc-ch5p1-sbu;</seg>
        <seg>&gcc-ch5p1-du;</seg>
      </seglistitem>
    </segmentedlist>

  </sect2>

  <sect2 role="installation">
    <title>Установка кросс-пакета GCC</title>

    <para>Пакет GCC требует пакеты GMP, MPFR и MPC. Так как эти пакеты могут не быть установлены в хост-системе, они будут скомпилированы вместе с GCC. Распакуйте каждый пакет в каталог с исходным кодом пакета GCC и переименуйте их чтобы эти пакеты использовались в процессе сборки GCC и были скомпилированы автоматически.</para>

    <note><para>В этом разделе часто возникают недоразумения. Процедуры таки же же как и в любом другом разделе, и полностью соответствуют инструкции по сборке пакетов (<xref
    linkend='buildinstr'/>). Сначала распакуйте пакет GCC из архива, который находится в каталоге с другими архивами пакетов и патчами, затем перейдите в распакованный каталог. Только после этого вы должны следовать приведенным ниже инструкциям.</para></note>

<screen><userinput remap="pre">tar -xf ../mpfr-&mpfr-version;.tar.xz
mv -v mpfr-&mpfr-version; mpfr
tar -xf ../gmp-&gmp-version;.tar.xz
mv -v gmp-&gmp-version; gmp
tar -xf ../mpc-&mpc-version;.tar.gz
mv -v mpc-&mpc-version; mpc</userinput></screen>

    <para>Следующая команда изменит место расположения динамического компоновщика чтобы использовать тот, который находится в каталоге <filename class="directory">/tools</filename>. Команда также удалит каталог <filename
    class="directory">/usr/include</filename> из путей поиска GCC. Выполните команду:</para>

<screen><userinput remap="pre">for file in gcc/config/{linux,i386/linux{,64}}.h
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&amp;@g' \
      -e 's@/usr@/tools@g' $file.orig &gt; $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' &gt;&gt; $file
  touch $file.orig
done</userinput></screen>

    <para>Если команда приведенная выше кажется непонятной, давайте разберем ее содержимое.
	 Сначала мы копируем файлы <filename>gcc/config/linux.h</filename>, <filename>gcc/config/i386/linux.h</filename>,и <filename>gcc/config/i368/linux64.h</filename> в файлы с таким же наименованием, но с добавлением суффикса <quote>.orig</quote>. Затем первое выражение добавляет <quote>/tools</quote> к каждому экземпляру <quote>/lib/ld</quote>, <quote>/lib64/ld</quote> или <quote>/lib32/ld</quote> в то время как второй заменяет жестко закодированные экземпляры <quote>/usr</quote>. Потом мы добавляем нашу директиву define которая изменяет префикс начальных файлов на префикс конечных файлов. Обратите внимание что начальный символ <quote>/</quote> в <quote>/tools/lib/</quote> является обязательным. Потом мы используем команду <command>touch</command> для обновления даты и времени модификации скопированных файлов. При использовании в сочетании с <command>cp -u</command> предотвращает непредвиденные изменения исходных файлов, если команды случайно выполнили дважды.</para>

    <para>Наконец, для хост-системы x86_64 устанавливаем каталогом по умолчанию наименование 64-битных библиотек
	 в <quote>lib</quote>:</para>

<screen><userinput remap="pre">case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
 ;;
esac</userinput></screen>

<!--
    <para>GCC doesn't detect stack protection correctly, which causes problems
    for the build of Glibc-&glibc-version;, so fix that by issuing the following
    command:</para>

<screen><userinput remap="pre">sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure</userinput></screen>
-->

<!--
    <para>Also fix a problem identified upstream:</para>

<screen><userinput remap="pre">sed -i 's/if \((code.*))\)/if (\1 \&amp;\&amp; \!DEBUG_INSN_P (insn))/' gcc/sched-deps.c</userinput></screen>
-->
    <para>В документации пакета GCC рекомендуется выполнять сборку в отдельном каталоге:</para>

<screen><userinput remap="pre">mkdir -v build
cd       build</userinput></screen>

    <para>Подготовьте пакет GCC к компиляции:</para>

<screen><userinput remap="configure">../configure                                       \
    --target=$LFS_TGT                              \
    --prefix=/tools                                \
    --with-glibc-version=2.11                      \
    --with-sysroot=$LFS                            \
    --with-newlib                                  \
    --without-headers                              \
    --with-local-prefix=/tools                     \
    --with-native-system-header-dir=/tools/include \
    --disable-nls                                  \
    --disable-shared                               \
    --disable-multilib                             \
    --disable-decimal-float                        \
    --disable-threads                              \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --disable-libstdcxx                            \
    --enable-languages=c,c++</userinput></screen>
    <variablelist>
      <title>Значение параметров конфигурации:</title>

      <varlistentry>
        <term><parameter>--with-newlib</parameter></term>
        <listitem>
          <para>Так как рабочая библиотека C пока недоступна, необходимо убедиться в том, что константа inhibit_libc определена, когда выполняется сборка libgcc. Также это предотвратит компиляцию любого кода, которому необходима поддержка библиотеки libc.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--without-headers</parameter></term>
        <listitem>
          <para>Когда создается кросс-компилятор, пакету GCC необходимы стандартные заголовки, совместимые с целевой системой. Для требуемой задачи эти заголовочные файлы не нужны. Этот аргумент предотвращает поиск этих файлов пакетом GCC.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--with-local-prefix=/tools</parameter></term>
        <listitem>
          <para>Этот аргумент (локальный префикс) является местом в системе, где GCC будет искать локально установленные include файлы. По умолчанию этот путь <filename>/usr/local</filename>.
			 Указание на каталог <filename>/tools</filename> поможет оставить каталог <filename>/usr/local</filename> хост-системы за пределами поиска файлов устанавливаемого пакета GCC.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--with-native-system-header-dir=/tools/include</parameter></term>
        <listitem>
          <para>По умолчанию, GCC выполняет поиск системных заголовочных файлов в каталоге <filename>/usr/include</filename>. В сочетании с аргументом sysroot, поиск системных заголовочных файлов будет производится в каталоге <filename>$LFS/tools/include</filename>.Однако заголовочные файлы , которые будут установлены в следующих двух разделах, будут располагаться в каталоге <filename>$LFS/tools/include</filename>. Этот аргумент позволит искать их по указанному в значении пути. Вторым проходом сборки GCC, этот же аргумент обеспечит отсутствие заголовочных файлов из хост-системы.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--disable-shared</parameter></term>
        <listitem>
          <para>Аргумент указывает GCC, что необходимо произвести статическую линковку внутренних библиотек. Ето необходимо сделать, чтобы избежать возможных проблем с хост-системой.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--disable-decimal-float, --disable-threads,
              --disable-libatomic, --disable-libgomp, <!--- -disable-libmpx,-->
        --disable-libquadmath, --disable-libssp, --disable-libvtv,
        --disable-libstdcxx</parameter></term>
        <listitem>
          <para>
			 Этот аргумент отключает поддержку расширений для работы с десятичными числами и числами с плавающей запятой, потоками, библиотеками libatomic, libgomp, <!--libmpx,--> libquadmath, libssp,
          libvtv и стандартной библиотеки C++ соответственно. При компиляции этих функций, возникнет ошибка и для кросс-компилятора, эти функции не нужны, для того чтобы выполнить кросс-компиляцию временной библиотеки C (libc).</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--disable-multilib</parameter></term>
        <listitem>
          <para>Для платформы x86_64, LFS пока не поддерживает конфигурацию multilib. Этот аргумент ни как не повлияет, если установка выполняется на платформе x86.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--enable-languages=c,c++</parameter></term>
        <listitem>
          <para>Этот параметр гарантирует, что будут созданы только компиляторы C и C ++. Это единственные языки, которые нужны сейчас.</para>
        </listitem>
      </varlistentry>

    </variablelist>

    <para>Чтобы скомпилировать пакет, необходимо выполнить команду:</para>

<screen><userinput remap="make">make</userinput></screen>

    <para>Компиляция завершена. Как правило, на данном этапе необходимо выполнить наборы тестов для пакета, но сейчас пока рано, потому что инструменты для выполнения тестирования (Tcl, Expect, and DejaGNU) пока не на своём месте. Преимущества использования тестов на данный момент минимальны, поскольку программы из сборки первого прохода будут заменены на программы из сборки второго прохода.</para>

    <para>Установите пакет:</para>

<screen><userinput remap="install">make install</userinput></screen>
<!--
    <para>Using <parameter>- -disable-shared</parameter> means that the
    <filename>libgcc_eh.a</filename> file isn't created and installed. The
    Glibc package depends on this library as it uses
    <parameter>-lgcc_eh</parameter> within its build system. This dependency
    can be satisfied by creating a symlink to <filename>libgcc.a</filename>,
    since that file will end up containing the objects normally contained in
    <filename>libgcc_eh.a</filename>:</para>

<screen><userinput remap="install">ln -sv libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&amp;_eh/'`</userinput></screen>
-->
  </sect2>

  <sect2 role="content">
    <title/>

    <para>Подробная информация об этом пакете находится в
    <xref linkend="contents-gcc" role="."/></para>

  </sect2>

</sect1>
